package com.dxl.producer;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * Description: 生产者-路由模式
 *
 * @author: Yingyu Wei
 * <p>File Created at 2021/5/2</p>
 */
@Component
public class DirectProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;


    @Value("${log.direct}")
    private String exchange;

    public void logMessage(String routingKey) {
        /*String msg = "路由模式-时间：" + new Date();
        rabbitTemplate.convertAndSend(exchange, routingKey, msg);*/

        // 消息可靠性生产
        // 1. 设置回调确认对象
        rabbitTemplate.setConfirmCallback(confirmCallback);
        // 2. 消息内容
        String msg = "路由模式-时间：" + new Date();
        // 3. 相关数据
        CorrelationData correlationData = new CorrelationData();
        correlationData.setId("1001");
        // 4. 发送消息
        rabbitTemplate.convertAndSend(exchange, routingKey, msg, correlationData);
    }

    // 定义回调函数
    public RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
        // 消息发送完毕后，回调此确认方法
        @Override
        public void confirm(CorrelationData correlationData, boolean ack, String cause) {
            // CorrelationData: 相关数据
            // ack: 是否确认收到(true已确认收到，false未确认收到)
            // case: 失败原因
            System.out.println("ack 是否已收到" + ack);
            System.out.println("cause 失败原因" + cause);
            System.out.println(correlationData);
            if (ack) {
                // 发送成功
                System.out.println("消息已投递成功！");

            } else {
                // 未发送成功 // 取id？不取错误信息？
                System.out.println("消息发送失败" + correlationData.getId());

                // 发送失败业务逻辑处理。
                // ...
            }
        }
    };

}
